#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
char name[100][100]={'\0'};
int score[100][4]={0};
char temp_c[100];
int temp_h[4];
int num[100]={0};
double aver[3]={0};
int id=0;

int Len()
{
	int n=0;
	for(int i=0;i<100;i++)
	{
		if(num[i]!=0)
			n++;
	}
	return n;
}

void Swap(int i)
{
		void score_sum();
		memset(temp_h,0,sizeof(temp_h));
		memset(temp_c,'\0',sizeof(temp_c));
		memcpy(temp_h,score[i],sizeof(temp_h));
		memcpy(score[i],score[i+1],sizeof(temp_h));
		memcpy(score[i+1],temp_h,sizeof(temp_h));
		//学号交换
		int temp=num[i];
		num[i]=num[i+1];
		num[i+1]=temp;
		//姓名交换
		strcpy(temp_c,name[i]);
		strcpy(name[i],name[i+1]);
		strcpy(name[i+1],temp_c);
		//总分交换
		score_sum();
}


void student_input()
{
    int flag1=0;
    while(1)
    {
    	int n=Len();
        printf("\t\t\t\t请输入学生名字和学号(1-100)（两者用空格隔开）：");
        scanf("%s %d",&name[id],&num[id]);
        for(int j=0;j<n;j++)
        {
        	if(num[id]==num[j]&&num[j]!=0&&id!=j)
        	{
        		memset(name[id],'\0',sizeof(temp_c));num[id]=0;
        		printf("\t\t\t\t已有该学生，无法重复添加\n");
        		break;
			}
		}
		if(num[id]>100||num[id]<0)
		{
			printf("\t\t\t\t输入错误");
			continue;
		}
        printf("\t\t\t\t是否继续添加？1.是 2.否\n");
        printf("\t\t\t\t");
        scanf("%d",&flag1);
        id++;
        if(flag1==1)
            continue;
        else if(flag1==2)
            break;
        else
            continue;
    }
}
void Set_0(int mark)
{
	num[mark]=0;
	memset(score[mark],0,sizeof(temp_h));
	memset(name[mark],'\0',sizeof(temp_c));
}
void student_delete_num()
{
	int num1,n=Len(),mark,flag=0,flag2;
	while(1)
	{
		flag=0;
		printf("\t\t\t\t请输入你要删除的学生的学号：");
		scanf("%d",&num1);
		for(int i=0;i<n;i++)
		{
			if(num1==num[i]&&num[i]!=0)
			{
				mark=i;
				flag=1;
				break;
			}
		}
		num[mark]=0;
		for(int i=mark;i<n-1;i++)
			Swap(i);
		id=id-1;
		if(flag==0)
		{
			printf("\t\t\t\t无此学生,请重新输入\n");
			break;
		}
		
		printf("\t\t\t\t是否继续？1.是 2.否\n");
		printf("\t\t\t\t");
		scanf("%d",&flag2);
		if(flag2==1)
			continue;
		else
			break;
	}
}

void student_delete_name()
{
	int n=Len(),mark,flag=0,flag2;char temp[100];
	while(1)
	{
		flag=0;
		printf("\t\t\t\t请输入你要删除的学生的名字：");
		scanf("%s",&temp);
		for(int i=0;i<n;i++)
		{
			if(stricmp(temp,name[i])==0&&temp[0]!='\0')
			{
				mark=i;
				flag=1;
				break;
			}
		}
		num[mark]=0;
		for(int i=mark;i<n-1;i++)
		{
				Swap(i);
		}

		id=id-1;
		if(flag==0)
		{
			printf("\t\t\t\t无此学生,请重新输入\n");
			break;
		}
		printf("\t\t\t\t是否继续？1.是 2.否\n");
		printf("\t\t\t\t");
		scanf("%d",&flag2);
		if(flag2==1)
			continue;
		else
			break;
	}
}
void student_delete_all()
{
	int n=Len();
	for(int i=0;i<n;i++)
	{
		Set_0(i);
	}

}
void score_input()
{
    int num1_id,flag,flag1=0,score1,num1,flag2=0;void score_sum();
	void score_sum();
    while(1)
    {
    	flag2=0;
        printf("\t\t\t\t请输入您要添加成绩的学生学号(输入101退出)：");
        scanf("%d",&num1);
        if(num1<1||num1>102)
        {
        	printf("\t\t\t\t输入错误，请重新输入！\n");
        	continue;
		}
        if(num1==101) break;
        int n=Len();
        for(int i=0;i<n;i++)
        {
            if(num[i]==num1&&num[i]!=0)
            {
                num1_id=i;
                flag2=1;
			}
        }
        if(flag2==0) continue;
        while(1)
        {
        	printf("\t\t\t\t请依次输入语文、数学、英语成绩(0-150)：");
			scanf("%d %d %d",&score[num1_id][0],&score[num1_id][1],&score[num1_id][2]);
        	for(int i=0;i<3;i++)
        	{
        		flag1=0;
        		if(score[num1_id][i]<0||score[num1_id][i]>150)
        		{
        			score[num1_id][i]=0;
        			flag1=1;
				}
			}
			if(flag1==1)
			{
				printf("\t\t\t\t输入错误，请重新输入\n");
				continue;
			}
			break;
		}
		score_sum();
    }

}


void score_sort()
{
    int n=Len();
    for(int i=0;i<n-1;i++)
    {
    	for(int j=0;j<n-i-1;j++)
    	{
    		if(score[j][3]<score[j+1][3])
    			Swap(j);
		}

	}
}
void score_aver()
{
    double sum=0;
    int nums=Len();
    //判断大小
    
    //计算
    for(int i=0;i<3;i++)
    {
    	sum=0;
    	for(int j=0;j<nums;j++)
        	sum+=score[j][i];
    	aver[i]=sum/(1.0*nums);
	}
    for(int i=0;i<3;i++)
    {
        if(i==0)
            printf("\t\t\t\t语文平均成绩：%.3lf\n",aver[i]);
        else if(i==1)
            printf("\t\t\t\t数学平均成绩：%.3lf\n",aver[i]);
        else if(i==2)
            printf("\t\t\t\t英语平均成绩：%.3lf\n",aver[i]);
    }
}
void score_sum()
{
	int nums=Len();
    for(int i=0;i<nums;i++)
    {
    	int t=0;
        for(int j=0;j<3;j++)
            t+=score[i][j];
        score[i][3]=t;
    }
}

void name_sort()
{              
	int nums=Len();
	for(int i=0;i<nums-1;i++)
    {
    	for(int j=0;j<nums-i-1;j++)
    	{
    		if(stricmp(name[j],name[j+1])>0)
    			Swap(j);	
		}
	}
}
void num_sort()
{             
	int n=Len();
    for(int i=0;i<n-1;i++)
    {
    	for(int j=0;j<n-i-1;j++)
    	{
    		if(num[j]>num[j+1])
    			Swap(j);	
		}

	}
}
void  subject_sort()
{
    int flag,flag1,flag2;
    int nums=Len();
    while(1)
    {
    	printf("\t\t\t\t请输入你要通过哪个科目排序（从大到小）：1.语文 2.数学 3.英语(输入4退出)\n");
    	printf("\t\t\t\t");
    	 scanf("%d",&flag);
    	 if(flag==4)
    		 break;
    	for(int i=0;i<nums-1;i++)
    	{
    		for(int j=0;j<nums-i-1;j++)
    		{
    			if(score[j][flag-1]<score[j+1][flag-1])
    				Swap(j);
			}
		}
	}
   


}
void info_search_name()
{                     
    char ch[100];int flag1,flag=0;
    while(1)
    {
        printf("\t\t\t\t请输入您想要查找的学生名字:");
        scanf("%s",&ch);
        int n=Len(),mark;
        
        for(int i=0;i<n;i++)
        {
            if(stricmp(ch,name[i])==0&&ch[0]!='\0')
            {
                mark=i;flag=1;
			}
        }
        if(flag==0)
        {
        	printf("\t\t\t\t无此学生，请前往添加或重新输入\n");
        	break;
		}
    	printf("\t\t\t\t学号\t\t姓名\t\t语文\t\t数学\t\t英语\t\t总成绩\n");
        printf("\t\t\t\t%3d\t\t%s\t\t%3d\t\t%3d\t\t%3d\t\t%3d\n",num[mark],name[mark],score[mark][0],score[mark][1],score[mark][2],score[mark][3]);
        scanf("%d",&flag1);
        if(flag1==1)
            continue;
        else if(flag1==2)
            break;
        else
            break;

    }

}
void info_search_num()
{
    int temp,flag1,flag2=0;
    while(1)
    {
        printf("\t\t\t\t请输入您想要查找的学生学号（数字之间不能有空格）：");
        scanf("%d",&temp);
        int n=Len(),mark;
        
        for(int i=0;i<n;i++)
        {
            if(num[i]==temp&&num[i]!=0)
            {
                mark=i;
                flag2=1;
			}
        }
        if(flag2==0)
        {
        	printf("\t\t\t\t无此学生，请前往添加或重新输入\n");
        	break;
		}

    	printf("\t\t\t\t学号\t\t姓名\t\t语文\t\t数学\t\t英语\t\t总成绩\n");
        printf("\t\t\t\t%3d\t\t%s\t\t%3d\t\t%3d\t\t%3d\t\t%3d\n",num[mark],name[mark],score[mark][0],score[mark][1],score[mark][2],score[mark][3]);
        printf("\t\t\t\t是否继续？1.是 2.否\n");
        scanf("%d",&flag1);
        if(flag1==1)
            continue;
        else if(flag1==2)
        {
        	system("cls");
            break;
		}

        else
        {
        	system("cls");break;
		}
            

    }
}
int info_search_max()
{
    int info;
    int n=Len(),mark;
    score_sort();
    if(num[0]==0)
    {
    	printf("\t\t\t\t无学生数据,请前往添加\n");
    	return 0;
	}
	printf("\t\t\t\t最高分为：\n");
    printf("\t\t\t\t学号\t\t姓名\t\t语文\t\t数学\t\t英语\t\t总成绩\n");
    for(int i=0;i<n-1;i++)
    {
    	if(score[i][3]==score[i+1][3])
    		printf("\t\t\t\t%3d\t\t%s\t\t%3d\t\t%3d\t\t%3d\t\t%3d\n",num[i],name[i],score[i][0],score[i][1],score[i][2],score[mark][3]);
    	else
    		printf("\t\t\t\t%3d\t\t%s\t\t%3d\t\t%3d\t\t%3d\t\t%3d\n",num[i],name[i],score[i][0],score[i][1],score[i][2],score[i][3]);
    	continue;
	}
	return 0;
}
void info_output()
{
    int n=Len();int flag=0;
    printf("\t\t\t\t学号\t\t姓名\t\t语文\t\t数学\t\t英语\t\t总成绩\n");
    for(int i=0;i<n;i++)
    {
    	if(num[i]!=0)
    	{
    		flag=1;
    		printf("\t\t\t\t%3d\t\t%s\t\t%3d\t\t%3d\t\t%3d\t\t%3d\n",num[i],name[i],score[i][0],score[i][1],score[i][2],score[i][3]);

		}
        else
        {
        	flag=0;
			break;
		}

		if(flag==0)
			break;
	}
   	printf("\t\t\t\t打印完成\n");
}
void main_menu_bar()
{
	printf("\n");
    printf("\t\t\t\t**********************************************************\n");
    printf("\t\t\t\t**            欢迎来到cbaida学生成绩管理系统            **\n");
    printf("\t\t\t\t**                    学生成绩管理系统                  **\n");
    printf("\t\t\t\t**           感谢您使用本系统，希望您使用愉快！         **\n");
    printf("\t\t\t\t**           主菜单如下：                               **\n");
    printf("\t\t\t\t**                  1.学生的添加与删除                  **\n");
    printf("\t\t\t\t   (包括按学号删除,按姓名删除,全部删除,添加学生)          \n");
    printf("\t\t\t\t**                  2.成绩的添加与计算                  **\n");
    printf("\t\t\t\t   (包括学生成绩输入,平均成绩计算,总成绩计算)             \n");
    printf("\t\t\t\t        学生人数100以下,科目为语文,数学,英语             \n");
    printf("\t\t\t\t**                  3.成绩排序                          **\n");
    printf("\t\t\t\t (可选总成绩排序,某一门课程的成绩排序,姓名排序,学号排序)  \n");
    printf("\t\t\t\t**                  4.查找与打印                        **\n");
    printf("\t\t\t\t           (可选查询总成绩最高的学生和分数)               \n");
    printf("\t\t\t\t           (按姓名查找并输出姓名学号和成绩)               \n");
    printf("\t\t\t\t           (按学号查找并输出姓名学号和成绩)               \n");
    printf("\t\t\t\t           (打印全部学生的姓名学号和成绩)                 \n");
    printf("\t\t\t\t**           	    5.退出                              **\n");
    printf("\t\t\t\t**********************************************************\n");
    printf("\t\t\t\t             请输入您要进入的模块的序号:                  ");
}
void first_menu_bar()
{
    int first_id;
    system("cls");
    printf("\t\t\t\t**           学生的添加与删除                             **\n");
    printf("\t\t\t\t**    (删除一个元素后请自行操作排序，否则无法输出结果)    **\n");
    printf("\t\t\t\t**           1.学生的添加                                 **\n");
    printf("\t\t\t\t**           2.按学号删除                                 **\n");
    printf("\t\t\t\t**           3.按姓名删除                                 **\n");
    printf("\t\t\t\t**           4.全部删除                                   **\n");
    printf("\t\t\t\t**           5.返回主菜单                                 **\n");
    printf("\t\t\t\t             请输入您要进行的操作的序号:                   ");
    scanf("%d",&first_id);
    switch(first_id)
    {
        case 1:student_input();break;
        case 2:student_delete_num();break;
        case 3:student_delete_name();break;
        case 4:student_delete_all();break;
        case 5:system("cls");main_menu_bar();break;
        default:printf("\t\t\t\t输入错误，请重新输入序号:");first_menu_bar();break;
    }
}
void second_menu_bar()
{
    int second_id;
    system("cls");
    printf("\t\t\t\t**           成绩的添加与计算                             **\n");
    printf("\t\t\t\t**           1.学生成绩输入                               **\n");
    printf("\t\t\t\t**           2.平均成绩计算(若无数据显示-1)               **\n");
    printf("\t\t\t\t**           3.总成绩计算                                 **\n");
    printf("\t\t\t\t**           4.返回主菜单                                 **\n");
    printf("\t\t\t\t             请输入您要进行的操作的序号:                   ");
    scanf("%d",&second_id);
    switch(second_id)
    {
        case 1:score_input();break;
        case 2:score_aver();break;
        case 3:score_sum();break;
        case 4:system("cls");main_menu_bar();break;
        default:printf("\t\t\t\t输入错误，请重新输入序号:");second_menu_bar();break;
    }
}
void third_menu_bar()
{
    int third_id;
    system("cls");
    printf("\t\t\t\t**              成绩排序                                  **\n");
    printf("\t\t\t\t**           1.总成绩排序                                 **\n");
    printf("\t\t\t\t**           2.某一门课程的成绩排序                       **\n");
    printf("\t\t\t\t**           3.姓名排序                                   **\n");
    printf("\t\t\t\t**           4.学号排序                                   **\n");
    printf("\t\t\t\t**           5.返回主菜单                                 **\n");
    printf("\t\t\t\t        请输入您要进行的操作的序号:                        ");
    scanf("%d",&third_id);
    switch(third_id)
    {
        case 1:score_sort();break;
        case 2:subject_sort();break;
        case 3:name_sort();break;
        case 4:num_sort();break;
        case 5:system("cls");main_menu_bar();break;
        default:printf("\t\t\t\t输入错误，请重新输入序号:");third_menu_bar();break;
    }
}
void fourth_menu_bar()
{                    
    int fourth_id;
    system("cls");
    printf("\t\t\t\t**              查找与打印                                **\n");
    printf("\t\t\t\t**           1.查询总成绩最高的学生和分数                 **\n");
    printf("\t\t\t\t**           2.按姓名查找并输出姓名学号和成绩             **\n");
    printf("\t\t\t\t**           3.按学号查找并输出姓名学号和成绩             **\n");
    printf("\t\t\t\t**           4.打印全部学生的姓名学号和成绩               **\n");
    printf("\t\t\t\t**           5.返回主菜单                                 **\n");
    printf("\t\t\t\t        请输入您要进行的操作的序号:                        ");
    scanf("%d",&fourth_id);
    switch(fourth_id)
    {
        case 1:info_search_max();break;
        case 2:info_search_name();break;
        case 3:info_search_num();break;
        case 4:info_output();break;
		case 5:system("cls");main_menu_bar();break;
        default:printf("\t\t\t\t输入错误，请重新输入序号:");fourth_menu_bar();break;
    }
}
int main()
{
    int mode_id;
    while(1)
    {
        main_menu_bar();
        scanf("%d",&mode_id);
        if(mode_id>5&&mode_id<1)
        {
            printf("\t\t\t\t输入错误，请重新输入序号:");
            system("cls");
            continue;
        }
        switch(mode_id)
        {
            case 1:first_menu_bar();break;
            case 2:second_menu_bar();break;
            case 3:third_menu_bar();break;
            case 4:fourth_menu_bar();break;
            case 5:return 0;break;
        }
    }
    system("cls");
    printf("\t\t\t\t再见！欢迎您的再次使用!");
}